/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.DocumentoFisica;
import hibernate.objeto.Documento;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.Vector;

/**
 *
 * @author Gonzalo
 */
public class DocumentoLogica extends CapaLogica {

    /**
     * Crea y persiste el documento.
     *
     * @param datosDocumento Los datos a cargar
     * @param documento El documento que se esta agregando/modificando
     * @param idDocumento El arreglo en donde se guarda el id del objeto Documento
     * creado para su posterior recuperación
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarOModificarDocumento(
            Object[] datosDocumento, Documento documento, int[] idDocumento) {
        documento = crearObjetoDocumento(datosDocumento, documento);
        
        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(documento)) {
            idDocumento[0] = documento.getIdDocumento();
            return true;
        } else {
            return false;
        }
    }
    
    /**
     * Elimina fisicamente un documento de la bd.
     * 
     * @param documento El documento a eliminar
     * @return true si se eliminó correctamente, false en caso contrario
     */
    public static boolean eliminarDocumento(Documento documento) {
        //Persiste el objeto
        if (CapaFisica.eliminarObjeto(documento)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto Documento con los datos pasados por parámetro.
     *
     * @param datosDocumento Los datos a cargar
     * @param documento El documento para crearlo y obternerlo
     * 
     * @return El objeto Documento creado
     */
    private static Documento crearObjetoDocumento(Object[] datosDocumento,
            Documento documento) {
        //Si el documento es nulo debe crearse.
        if (documento == null) {
            documento = new Documento();
        }
        
        documento.setHoraDocumento(
                (String) datosDocumento[CARGA_DOCUMENTO_HORA]);

        documento.setFechaDocumento(
                (Date) datosDocumento[CARGA_DOCUMENTO_FECHA]);

        documento.setNombreDocumento(
                (String) datosDocumento[CARGA_DOCUMENTO_NOMBRE]);

        documento.setNombreAutorDocumento(
                (String) datosDocumento[CARGA_DOCUMENTO_NOMBRE_AUTOR]);
        
        documento.setApellidoAutorDocumento(
                (String) datosDocumento[CARGA_DOCUMENTO_APELLIDO_AUTOR]);

        if (!datosDocumento[
                CARGA_DOCUMENTO_ADJUNTO].toString().equals("")
                && datosDocumento[
                CARGA_DOCUMENTO_ADJUNTO].toString().contains("\\")) {
            String rutaAdjuntoArreglada =
                    reemplazarUnaBarraInvertidaPorDosBarrasInvertidas(
                    datosDocumento[CARGA_DOCUMENTO_ADJUNTO].toString());

            File file = new File(rutaAdjuntoArreglada);
            byte[] bFile = new byte[(int) file.length()];

            try {
                FileInputStream fileInputStream = new FileInputStream(file);
                //convert file into array of bytes
                fileInputStream.read(bFile);
                fileInputStream.close();
            } catch (Exception exc) {
                System.err.println(exc.getMessage());
            }
            documento.setNombreArchivoDocumento(file.getName());
            documento.setArchivoDocumento(bFile);

        } else if (datosDocumento[
                CARGA_DOCUMENTO_ADJUNTO].toString().equals("")){
            documento.setNombreArchivoDocumento(null);
            documento.setArchivoDocumento(null);
        }
        
        documento.setComentarioDocumento(
                (String) datosDocumento[CARGA_DOCUMENTO_COMENTARIOS]);
        
        documento.setTipoDocumento(
                (String) datosDocumento[CARGA_DOCUMENTO_TIPO]);
        
        return documento;
    }
    
    /**
     * Retorna el vector de objetos Documento según el tipo de documento.
     *
     * @param tipoDocumento El tipo del Documento, puede ser "consentimiento 
     * informado" o "ficha de seguimiento"
     * @return El vector de objetos Documento consultado, null si no existe
     */
    public static Vector<Documento> getVectorDocumentoPorTipo(String tipoDocumento) {
        return DocumentoFisica.getVectorDocumentoPorTipo(tipoDocumento);
    }
    
    /**
     * Retorna el objeto Documento según el id.
     *
     * @param idDocumento El id del Documento
     * @return El objeto Documento consultado, null si no existe
     */
    public static Documento getDocumentoPorId(int idDocumento) {
        return DocumentoFisica.getDocumentoPorId(idDocumento);
    }
    
}
